package com.itheima.health.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.itheima.health.dao.OrdersettingDao;
import com.itheima.health.exception.MyException;
import com.itheima.health.pojo.OrderSetting;
import com.itheima.health.service.OrdersettingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Map;

/**
 * @program: health_parent
 * @description:
 * @author: HuChunping
 * @create: 2021-01-13 17:05
 **/
@Service(interfaceClass = OrdersettingService.class)
public class OrdersettingServiceImpl implements OrdersettingService {
    @Autowired
    private OrdersettingDao ordersettingDao;

    /**
    * @Description: 预约批量导入Excel，修改(数据库存在日期)/添加(数据库不存在日期)预约
    * @Param: [orderSettingList]
    * @return: void
    * @Author: HuChunping
    * @Date: 2021/1/13-17:05
    */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void addbatch(List<OrderSetting> orderSettingList) {
        if (!CollectionUtils.isEmpty(orderSettingList)) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            for (OrderSetting orderSetting : orderSettingList) {
                // List<OrderSetting>现在其中已经是OrderSetting实体类
                // 通过日期查找预约
                OrderSetting osInDB = ordersettingDao.findByOrderDate(orderSetting.getOrderDate());
                // 如果数据库中不存在预约，则直接添加预约日期和最大预约人数
                if (osInDB==null){
                    // 不存在数据，添加数据
                    ordersettingDao.add(orderSetting);
                } else {
                    // 存在则需要判断已预约人数是否等于大于最大预约人数
                    // 最大预约人数
                    int maxOrderNum = osInDB.getNumber();
                    // 已预约人数
                    int reservations = osInDB.getReservations();
                    if (reservations >= maxOrderNum) {
                        // 表格传入的是预约日期和最大预约人数(后台来修改)
                        throw new MyException(sdf.format(orderSetting.getOrderDate()) + "：要修改的最大预约人数不能小于已预约的人数");
                    } else {
                        // 最大预约人数更多，可以更新
                        ordersettingDao.update(orderSetting);
                    }
                }

            }
        }
    }

    /**
    * @Description: 通过年月查询当月数据
    * @Param: [month]：值：2021-01, 通过2021-01%,模糊查询所有1月份的数据
    * @return: java.util.List<java.util.Map<java.lang.String,java.lang.Integer>>
    * @Author: HuChunping
    * @Date: 2021/1/14-19:53
    */
    @Override
    public List<Map<String, Integer>> getOrderSettingByMonth(String month) {
        month+="%";
        return ordersettingDao.getOrderSettingByMonth(month);
    }

    /**
    * @Description: 通过日期更新预约设置, ,没有操作多条记录，不需要加事务
    * @Param: [orderSetting]
    * @return: void
    * @Author: HuChunping
    * @Date: 2021/1/14-21:44
    */
    @Override
    public void editNumberByDate(OrderSetting orderSetting) throws MyException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        // List<OrderSetting>现在其中已经是OrderSetting实体类
        // 通过日期查找预约
        OrderSetting osInDB = ordersettingDao.findByOrderDate(orderSetting.getOrderDate());
        // 如果数据库中不存在预约，则直接添加预约日期和最大预约人数
        if (osInDB==null){
            // 不存在数据，添加数据
            ordersettingDao.add(orderSetting);
        } else {
            // 存在则需要判断已预约人数是否等于大于最大预约人数
            // 最大预约人数
            int maxOrderNum = osInDB.getNumber();
            // 已预约人数
            int reservations = osInDB.getReservations();
            if (reservations >= maxOrderNum) {
                // 表格传入的是预约日期和最大预约人数(后台来修改)
                throw new MyException(sdf.format(orderSetting.getOrderDate()) + "：要修改的最大预约人数不能小于已预约的人数");
            } else {
                // 最大预约人数更多，可以更新
                ordersettingDao.update(orderSetting);
            }
        }
    }
}
